package com.genericity.demo06;

public class Test {
    public static void main(String[] args) {
        System.out.println("学习通配符");
        // 使用泛型类
        Box<Number> box1 = new Box<>();
        box1.setFirst(100);
        // 调用方法
        showBox(box1);

        Box<Integer> box2 = new Box<>();
        box2.setFirst(200);
        // 调用方法
        showBox(box2);
    }

    /**
     * 思考一个问题：
     * 泛型，就是我们可以传递任何数据类型，但是这里定义为了
     * Number类型了，如果我需要传递 String或Integer类型
     * 岂不是可以了吗？
     * @param box
     */
    //public static void showBox(Box<Number> box) {
    //    Number first = box.getFirst();
    //    System.out.println(first);
    //}

    /**
     * 所以针对上述问题，Java推出了一个通配符 ？
     * 可以接收任何数据类型，把方法更改为如下：
     */
    public static void showBox(Box<?> box) {
        Object first = box.getFirst();
        System.out.println(first);
    }

    /**
     * 类型通配符的上限
     * @param box
     */
    public static void upperBox(Box<? extends Number> box) {
        /**
         * <? extends Number> 意思就是：传递进来的数据类型
         * 要么是 Number 子类 要么就是 Number类，规定上限范围了
         */
        Number first = box.getFirst();
        System.out.println(first);
    }
}
